package store;

import org.jdom.Element;
import dataview.TipoTermine;
import exceptions.XmlException;

public class Termine {
	public static Termine vegetale = new Termine(TipoTermine.genere_cibo, "vegetale");
	public static Termine minerale = new Termine(TipoTermine.genere_cibo, "minerale");
	public static Termine latticini = new Termine(TipoTermine.genere_cibo, "latticini");
	public static Termine uova = new Termine(TipoTermine.genere_cibo, "uova");
	public static Termine animale = new Termine(TipoTermine.genere_cibo, "animale");
	public static Termine bevanda = new Termine(TipoTermine.genere_cibo, "bevanda");
	
	private String termine;
	private TipoTermine tipo;
	
	private Termine() {}
	
	public Termine(TipoTermine tipo, String termine) {
		this.tipo = tipo;
		this.termine = termine.replace(' ', '_');
	}
	
	public boolean isVegano () {
		if (tipo != TipoTermine.genere_cibo) throw new IllegalArgumentException();
		return !diTipo(animale);
	}
	
	public boolean isVegetariano () {
		if (tipo != TipoTermine.genere_cibo) throw new IllegalArgumentException();
		return diTipo(vegetale) || diTipo(minerale) || diTipo(uova) || diTipo(latticini);
	}
	
	public boolean diTipo(Termine termine) {
		return Terminologia.getTerminologia().diTipo(this, termine);
	}
	
	public static Termine fromXml(Element element) throws XmlException {
		if (element == null) throw new IllegalArgumentException();
		Termine termine = new Termine();
		TipoTermine tipo;
		if ((tipo = TipoTermine.valueOf(element.getName())) == null) throw new XmlException("L'elemento passato come parametro non rappresenta un termine");
		termine.tipo = tipo;
		termine.termine = element.getAttributeValue("nome");
		return termine;
	}
	
	public Element toXml() {
		return new Element(tipo.name()).setAttribute("nome", termine);
	}
	
	public String getTermine() {
		return termine;
	}
	
	public TipoTermine getTipo() {
		return tipo;
	}
	
	@Override
	public String toString() {
		return termine.replace('_', ' ');
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((termine == null) ? 0 : termine.hashCode());
		result = prime * result + ((tipo == null) ? 0 : tipo.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		Termine other = (Termine)obj;
		if (termine == null) {
			if (other.termine != null) return false;
		} else if (!termine.equals(other.termine)) return false;
		if (tipo == null) {
			if (other.tipo != null) return false;
		} else if (!tipo.equals(other.tipo)) return false;
		return true;
	}
	
}
